<?php
/*
----------------------------------------------------------------------------------------------------------------
HTTP Simple Queue Service - httpsqs client class for PHP v1.3

Author: Zhang Yan (http://blog.s135.com), E-mail: net@s135.com
This is free software, and you are welcome to modify and redistribute it under the New BSD License
----------------------------------------------------------------------------------------------------------------
Useage:
<?php
include_once("httpsqs_client.php");
$httpsqs = new httpsqs;

//http connect without Keep-Alive  (Use in Webserver)
$result = $httpsqs->put($host, $port, $charset, $name, $data); //1. PUT text message into a queue. If PUT successful, return boolean: true. If an error occurs, return boolean: false. If queue full, return text: HTTPSQS_PUT_END
$result = $httpsqs->get($host, $port, $charset, $name); //2. GET text message from a queue. Return the queue contents. If an error occurs, return boolean: false. If there is no unread queue message, return text: HTTPSQS_GET_END
$result = $httpsqs->gets($host, $port, $charset, $name); //3. GET text message and pos from a queue. Return example: array("pos" => 7, "data" => "text message"). If an error occurs, return boolean: false. If there is no unread queue message, return: array("pos" => 0, "data" => "HTTPSQS_GET_END")
$result = $httpsqs->status($host, $port, $charset, $name); //4. View queue status
$result = $httpsqs->status_json($host, $port, $charset, $name); //5. View queue status in json. Return example: {"name":"queue_name","maxqueue":5000000,"putpos":130,"putlap":1,"getpos":120,"getlap":1,"unread":10}
$result = $httpsqs->view($host, $port, $charset, $name, $pos); //6. View the contents of the specified queue pos (id). Return the contents of the specified queue pos.
$result = $httpsqs->reset($host, $port, $charset, $name); //7. Reset the queue. If reset successful, return boolean: true. If an error occurs, return boolean: false
$result = $httpsqs->maxqueue($host, $port, $charset, $name, $num); //8. Change the maximum queue length of per-queue. If change the maximum queue length successful, return boolean: true. If  it be cancelled, return boolean: false
$result = $httpsqs->synctime($host, $port, $charset, $name, $num); //9. Change the interval to sync updated contents to the disk. If change the interval successful, return boolean: true. If  it be cancelled, return boolean: false

//http pconnect with Keep-Alive (Very fast in Command line mode)
$result = $httpsqs->pput($host, $port, $charset, $name, $data); //1. PUT text message into a queue. If PUT successful, return boolean: true. If an error occurs, return boolean: false.  If queue full, return text: HTTPSQS_PUT_END
$result = $httpsqs->pget($host, $port, $charset, $name); //2. GET text message from a queue. Return the queue contents. If an error occurs, return boolean: false. If there is no unread queue message, return text: HTTPSQS_GET_END
$result = $httpsqs->pgets($host, $port, $charset, $name); //3. GET text message and pos from a queue. Return example: array("pos" => 7, "data" => "text message"). If there is no unread queue message, return: array("pos" => 0, "data" => "HTTPSQS_GET_END")
$result = $httpsqs->pstatus($host, $port, $charset, $name); //4. View queue status
$result = $httpsqs->pstatus_json($host, $port, $charset, $name); //5. View queue status in json. Return example: {"name":"queue_name","maxqueue":5000000,"putpos":130,"putlap":1,"getpos":120,"getlap":1,"unread":10}
$result = $httpsqs->pview($host, $port, $charset, $name, $pos); //6. View the contents of the specified queue pos (id). Return the contents of the specified queue pos.
$result = $httpsqs->preset($host, $port, $charset, $name); //7. Reset the queue. If reset successful, return boolean: true. If an error occurs, return boolean: false
$result = $httpsqs->pmaxqueue($host, $port, $charset, $name, $num); //8. Change the maximum queue length of per-queue. If change the maximum queue length successful, return boolean: true. If  it be cancelled, return boolean: false
$result = $httpsqs->psynctime($host, $port, $charset, $name, $num); //9. Change the interval to sync updated contents to the disk. If change the interval successful, return boolean: true. If  it be cancelled, return boolean: false

----------------------------------------------------------------------------------------------------------------
*/
error_reporting(E_ERROR);
$GLOBAL_HTTPSQS_PSOCKET = false;

class httpsqsd extends httpsqs
{
    var $host;
    var $port;
    var $charset;

    function __construct($host, $port, $charset = 'utf-8')
    {
        $this->host = $host;
        $this->port = $port;
        $this->charset = $charset;
    }

    function get($name)
    {
        return parent::get($this->host, $this->port, $this->charset, $name);
    }

    function put($name, $data)
    {
        return parent::put($this->host, $this->port, $this->charset, $name, $data);
    }

    function reset($name)
    {
        return parent::reset($this->host, $this->port, $this->charset, $name);
    }

    function status($name)
    {
        return parent::status($this->host, $this->port, $this->charset, $name);
    }
}

class httpsqs
{
    function http_get($host, $port, $query)
    {
        $httpsqs_socket = @fsockopen($host, $port, $errno, $errstr, 5);
        if (!$httpsqs_socket)
        {
            return false;
        }
        $out = "GET ${query} HTTP/1.1\r\n";
        $out .= "Host: ${host}\r\n";
        $out .= "Connection: close\r\n";
        $out .= "\r\n";
        fwrite($httpsqs_socket, $out);
        $line = trim(fgets($httpsqs_socket));
        $header = $line;
        list($proto, $rcode, $result) = explode(" ", $line);
        $len = -1;
        while (($line = trim(fgets($httpsqs_socket))) != "")
        {
            $header .= $line;
            if (strstr($line, "Content-Length:"))
            {
                list($cl, $len) = explode(" ", $line);
            }
            if (strstr($line, "Pos:"))
            {
                list($pos_key, $pos_value) = explode(" ", $line);
            }
        }
        if ($len < 0)
        {
            return false;
        }
        $body = @fread($httpsqs_socket, $len);
        fclose($httpsqs_socket);
                $result_array["pos"] = (int)$pos_value;
                $result_array["data"] = $body;
        return $result_array;
    }

    function http_post($host, $port, $query, $body)
    {
        $httpsqs_socket = @fsockopen($host, $port, $errno, $errstr, 5);
        if (!$httpsqs_socket)
        {
            return false;
        }
        $out = "POST ${query} HTTP/1.1\r\n";
        $out .= "Host: ${host}\r\n";
        $out .= "Content-Length: " . strlen($body) . "\r\n";
        $out .= "Connection: close\r\n";
        $out .= "\r\n";
        $out .= $body;
        fwrite($httpsqs_socket, $out);
        $line = trim(fgets($httpsqs_socket));
        $header = $line;
        list($proto, $rcode, $result) = explode(" ", $line);
        $len = -1;
        while (($line = trim(fgets($httpsqs_socket))) != "")
        {
            $header .= $line;
            if (strstr($line, "Content-Length:"))
            {
                list($cl, $len) = explode(" ", $line);
            }
            if (strstr($line, "Pos:"))
            {
                list($pos_key, $pos_value) = explode(" ", $line);
            }
        }
        if ($len < 0)
        {
            return false;
        }
        $body = @fread($httpsqs_socket, $len);
        fclose($httpsqs_socket);
                $result_array["pos"] = (int)$pos_value;
                $result_array["data"] = $body;
        return $result_array;
    }
        
    function http_pget($host, $port, $query)
    {
                global $GLOBAL_HTTPSQS_PSOCKET;
                $hostport = md5($host.":".$port);
        if (!$GLOBAL_HTTPSQS_PSOCKET[$hostport])
        {
                        $GLOBAL_HTTPSQS_PSOCKET[$hostport] = @pfsockopen($host, $port, $errno, $errstr, 5);
        }
        if (!$GLOBAL_HTTPSQS_PSOCKET[$hostport])
        {
            return false;
        }
        $out = "GET ${query} HTTP/1.1\r\n";
        $out .= "Host: ${host}\r\n";
        $out .= "Connection: Keep-Alive\r\n";
        $out .= "\r\n";
        fwrite($GLOBAL_HTTPSQS_PSOCKET[$hostport], $out);
        $line = trim(fgets($GLOBAL_HTTPSQS_PSOCKET[$hostport]));
                if (empty($line) == true) {
                        unset($GLOBAL_HTTPSQS_PSOCKET[$hostport]);
                        $GLOBAL_HTTPSQS_PSOCKET[$hostport] = @pfsockopen($host, $port, $errno, $errstr, 5);
                        if ($GLOBAL_HTTPSQS_PSOCKET[$hostport])
                        {
                                fwrite($GLOBAL_HTTPSQS_PSOCKET[$hostport], $out);
                                $line = trim(fgets($GLOBAL_HTTPSQS_PSOCKET[$hostport]));
                        } else {
                                return false;
                        }
                }
        $header = $line;
        list($proto, $rcode, $result) = explode(" ", $line);
        $len = -1;
        while (($line = trim(fgets($GLOBAL_HTTPSQS_PSOCKET[$hostport]))) != "")
        {
            $header .= $line;
            if (strstr($line, "Content-Length:"))
            {
                list($cl, $len) = explode(" ", $line);
            }
            if (strstr($line, "Pos:"))
            {
                list($pos_key, $pos_value) = explode(" ", $line);
            }                   
        }
        if ($len < 0)
        {
            return false;
        }
        $body = @fread($GLOBAL_HTTPSQS_PSOCKET[$hostport], $len);
                $result_array["pos"] = (int)$pos_value;
                $result_array["data"] = $body;
        return $result_array;
    }

    function http_ppost($host, $port, $query, $body)
    {
                global $GLOBAL_HTTPSQS_PSOCKET;
                $hostport = md5($host.":".$port);
        if (!$GLOBAL_HTTPSQS_PSOCKET[$hostport])
        {
                        $GLOBAL_HTTPSQS_PSOCKET[$hostport] = @pfsockopen($host, $port, $errno, $errstr, 5);
        }
        if (!$GLOBAL_HTTPSQS_PSOCKET[$hostport])
        {
            return false;
        }
        $out = "POST ${query} HTTP/1.1\r\n";
        $out .= "Host: ${host}\r\n";
        $out .= "Content-Length: " . strlen($body) . "\r\n";
        $out .= "Connection: Keep-Alive\r\n";
        $out .= "\r\n";
        $out .= $body;
        fwrite($GLOBAL_HTTPSQS_PSOCKET[$hostport], $out);
        $line = trim(fgets($GLOBAL_HTTPSQS_PSOCKET[$hostport]));
                if (empty($line) == true) {
                        unset($GLOBAL_HTTPSQS_PSOCKET[$hostport]);
                        $GLOBAL_HTTPSQS_PSOCKET[$hostport] = @pfsockopen($host, $port, $errno, $errstr, 5);
                        if ($GLOBAL_HTTPSQS_PSOCKET[$hostport])
                        {
                                fwrite($GLOBAL_HTTPSQS_PSOCKET[$hostport], $out);
                                $line = trim(fgets($GLOBAL_HTTPSQS_PSOCKET[$hostport]));
                        } else {
                                return false;
                        }
                }               
        $header = $line;
        list($proto, $rcode, $result) = explode(" ", $line);
        $len = -1;
        while (($line = trim(fgets($GLOBAL_HTTPSQS_PSOCKET[$hostport]))) != "")
        {
            $header .= $line;
            if (strstr($line, "Content-Length:"))
            {
                list($cl, $len) = explode(" ", $line);
            }
            if (strstr($line, "Pos:"))
            {
                list($pos_key, $pos_value) = explode(" ", $line);
            }
        }
        if ($len < 0)
        {
            return false;
        }
        $body = @fread($GLOBAL_HTTPSQS_PSOCKET[$hostport], $len);
                $result_array["pos"] = (int)$pos_value;
                $result_array["data"] = $body;
        return $result_array;
    }
    
        /* ------------------ http connect without Keep-Alive  (Use in Webserver)  ------------------------ */
        
    function put($host, $port, $charset='utf-8', $name, $data)
    {
        $result = $this->http_post($host, $port, "/?charset=".$charset."&name=".$name."&opt=put", $data);
                if ($result["data"] == "HTTPSQS_PUT_OK") {
                        return true;
                } else if ($result["data"] == "HTTPSQS_PUT_END") {
                        return $result["data"];
                }
                return false;
    }
    
    function get($host, $port, $charset='utf-8', $name)
    {
        $result = $this->http_get($host, $port, "/?charset=".$charset."&name=".$name."&opt=get");
                if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false) {
                        return false;
                }
        return $result["data"];
    }
        
    function gets($host, $port, $charset='utf-8', $name)
    {
        $result = $this->http_get($host, $port, "/?charset=".$charset."&name=".$name."&opt=get");
                if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false) {
                        return false;
                }
        return $result;
    }   
        
    function status($host, $port, $charset='utf-8', $name)
    {
        $result = $this->http_get($host, $port, "/?charset=".$charset."&name=".$name."&opt=status");
                if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false) {
                        return false;
                }
        return $result["data"];
    }
        
    function view($host, $port, $charset='utf-8', $name, $pos)
    {
        $result = $this->http_get($host, $port, "/?charset=".$charset."&name=".$name."&opt=view&pos=".$pos);
                if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false) {
                        return false;
                }
        return $result["data"];
    }
        
    function reset($host, $port, $charset='utf-8', $name)
    {
        $result = $this->http_get($host, $port, "/?charset=".$charset."&name=".$name."&opt=reset");
                if ($result["data"] == "HTTPSQS_RESET_OK") {
                        return true;
                }
        return false;
    }
        
    function maxqueue($host, $port, $charset='utf-8', $name, $num)
    {
        $result = $this->http_get($host, $port, "/?charset=".$charset."&name=".$name."&opt=maxqueue&num=".$num);
                if ($result["data"] == "HTTPSQS_MAXQUEUE_OK") {
                        return true;
                }
        return false;
    }
        
    function status_json($host, $port, $charset='utf-8', $name)
    {
        $result = $this->http_get($host, $port, "/?charset=".$charset."&name=".$name."&opt=status_json");
                if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false) {
                        return false;
                }
        return $result["data"];
    }

    function synctime($host, $port, $charset='utf-8', $name, $num)
    {
        $result = $this->http_get($host, $port, "/?charset=".$charset."&name=".$name."&opt=synctime&num=".$num);
                if ($result["data"] == "HTTPSQS_SYNCTIME_OK") {
                        return true;
                }
        return false;
    }   
        
        /* ------------------ http pconnect with Keep-Alive (Very fast in Command line mode)  ------------------------ */       
        
    function pput($host, $port, $charset='utf-8', $name, $data)
    {
        $result = $this->http_ppost($host, $port, "/?charset=".$charset."&name=".$name."&opt=put", $data);
                if ($result["data"] == "HTTPSQS_PUT_OK") {
                        return true;
                } else if ($result["data"] == "HTTPSQS_PUT_END") {
                        return $result["data"];
                }
                return false;
    }
    
    function pget($host, $port, $charset='utf-8', $name)
    {
        $result = $this->http_pget($host, $port, "/?charset=".$charset."&name=".$name."&opt=get");      
                if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false) {
                        return false;
                }
        return $result["data"];
    }
        
    function pgets($host, $port, $charset='utf-8', $name)
    {
        $result = $this->http_pget($host, $port, "/?charset=".$charset."&name=".$name."&opt=get");      
                if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false) {
                        return false;
                }
        return $result;
    }   
        
    function pstatus($host, $port, $charset='utf-8', $name)
    {
        $result = $this->http_pget($host, $port, "/?charset=".$charset."&name=".$name."&opt=status");
                if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false) {
                        return false;
                }
        return $result["data"];
    }
        
    function pview($host, $port, $charset='utf-8', $name, $pos)
    {
        $result = $this->http_pget($host, $port, "/?charset=".$charset."&name=".$name."&opt=view&pos=".$pos);
                if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false) {
                        return false;
                }
        return $result["data"];
    }
        
    function preset($host, $port, $charset='utf-8', $name)
    {
        $result = $this->http_pget($host, $port, "/?charset=".$charset."&name=".$name."&opt=reset");
                if ($result["data"] == "HTTPSQS_RESET_OK") {
                        return true;
                }
        return false;
    }
        
    function pmaxqueue($host, $port, $charset='utf-8', $name, $num)
    {
        $result = $this->http_pget($host, $port, "/?charset=".$charset."&name=".$name."&opt=maxqueue&num=".$num);
                if ($result["data"] == "HTTPSQS_MAXQUEUE_OK") {
                        return true;
                }
        return false;
    }
        
    function pstatus_json($host, $port, $charset='utf-8', $name)
    {
        $result = $this->http_pget($host, $port, "/?charset=".$charset."&name=".$name."&opt=status_json");
                if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false) {
                        return false;
                }
        return $result["data"];
    }

    function psynctime($host, $port, $charset='utf-8', $name, $num)
    {
        $result = $this->http_pget($host, $port, "/?charset=".$charset."&name=".$name."&opt=synctime&num=".$num);
                if ($result["data"] == "HTTPSQS_SYNCTIME_OK") {
                        return true;
                }
        return false;
    }   
}
?>

